/*
 * ArchivoRelativo.cpp
 *
 *  Created on: 11/09/2010
 *      Author:
 */

#include "ArchivoRelativo.h"
#include "EntidadSerializable.h"

#include <fstream>
using std::ofstream;
using std::ifstream;
using std::fstream;
using std::ostream;

#include<string>
#include<vector>

using namespace std;


ArchivoRelativo::ArchivoRelativo( string unaDireccion , int max )
{
	direccion = unaDireccion;
	estaAbierto = false;
	max_registros = max;
}

int ArchivoRelativo::crear()
{
	ofstream miArchivo( direccion.data() , ios::binary );

	if ( !miArchivo )
	{
		// No se pudo crear el archivo.
		return RES_ERROR;
	}

	EntidadSerializable peliculaVacia; // Constructor por defecto, setea ID en cero.

	int i;
	for ( i = 0 ; i < max_registros ; i++ )
	{
		miArchivo.write( reinterpret_cast<const char*>( &peliculaVacia ) , sizeof( EntidadSerializable ) );
	}

	return RES_OK;
}

int ArchivoRelativo::abrir( ios::openmode mode )
{
	if (estaAbierto)
	{
		// Si ya estaba abierto que no lo vuelva a abrir.
		return RES_ERROR;
	}

	archivo.open( direccion.data() , mode );

	if ( !archivo )
	{
		// No se pudo abrir el archivo.
		return RES_ERROR;
	}

	estaAbierto = true;

	return RES_OK;
}

int ArchivoRelativo::cerrar(  )
{
	if (estaAbierto)
	{
		archivo.close();
		estaAbierto = false;
		return RES_OK;
	}

	// Si no estaba abierto devuelve error.
	return RES_ERROR;
}

EntidadSerializable ArchivoRelativo::leer( int id )
{
	EntidadSerializable unaEntidad;

	if ( !estaAbierto )
	{
		return unaEntidad; // El ID será CERO.
	}

	archivo.seekg( (id - 1 ) * sizeof( EntidadSerializable ) );
	archivo.read( reinterpret_cast< char * >( &unaEntidad ) , sizeof( EntidadSerializable ) );

	return unaEntidad;
}

int ArchivoRelativo::escribir( EntidadSerializable &unaEntidad )
{
	if ( !estaAbierto )
	{
		return RES_ERROR;
	}

	int posicion = unaEntidad.getID() - 1;
	archivo.seekp(posicion * sizeof( EntidadSerializable ) );
	archivo.write( reinterpret_cast< char * >( &unaEntidad ) , sizeof( EntidadSerializable ) );

	return RES_OK;
}
